Return to MUSA 801 Projects Page

This project was completed for the MUSA/Smart Cities Practicum course (MUSA 801) instructed by Michael Fichman and Matthew Harris. We are grateful to our instructors for their continued support and feedback. We would like to give special thanks to KC Filippino and Ben McFarlane from Hampton Roads Planning District Commission, and Dexter Locke from the United States Forest Service for providing data, insight, and support throughout the semester. This project would not have been possible without them.

View Dashboard

1.Introduction

1.1 Abstract

This project aims to develop a precision forecast model for land cover change at the Chesapeake Watershed. By leveraging high-resolution longitudinal land cover data provided by the Chesapeake Conservancy, the model will predict land cover conversions from pervious to impervious surfaces. This forecast will enable land use and environmental planners to identify where urban growth will occur, propose green infrastructure accordingly, and prioritize lands for protection. The model will be generalizable to the county level, incorporating only widely available inputs, thus allowing any municipality within the Chesapeake basin to replicate the analysis. This proof-of-concept project will demonstrate the utility of precision conservation in land protection and green infrastructure planning and provide a valuable tool for planners and policymakers across the region.

1.2 Background

The Chesapeake Bay watershed is an ecologically and economically significant resource, encompassing diverse ecosystems and supporting a multitude of industries, including agriculture, tourism, and fisheries. However, the region is facing increasing environmental challenges due to the combined effects of sea-level rise and land subsidence. As a result, the area has become the second-most vulnerable region in the nation to flooding and storm surge, only after New Orleans. Predicting land cover changes, particularly the conversion from pervious to impervious surfaces, is crucial in addressing these challenges and informing climate adaptation and mitigation planning.

Our project focuses on three distinct counties within the Chesapeake Bay watershed, representing varying development contexts. Portsmouth is the urban prototype characterized by its dense residential, commercial, and industrial areas. James City County exemplifies a suburban context, with a mix of rural, suburban, and urban development and a diverse landscape encompassing forests, wetlands, and historic sites. Lastly, Isle of Wight County represents the rural aspect, predominantly characterized by agriculture, forestry, and extensive natural habitats. By considering these diverse counties, we can develop a comprehensive and generalizable model to predict land cover changes across various regional development scenarios.

1.3 Motivation & Use Case

Building resilient communities is a top priority for the Hampton Roads Planning District Commission (HRPDC). To support this goal, the HRPDC has established a green infrastructure plan that seeks to identify and prioritize a network of valuable conservation lands. This plan aims to achieve multiple benefits, such as habitat protection, drinking water supply protection, stormwater management, and recreational opportunities.

A crucial component of this plan involves developing a model to forecast potential future growth and identify areas of the green infrastructure network that are most at risk for development. Our project aims to create a forecast that enables land use and environmental planners to pinpoint where urban growth is likely to occur, propose green infrastructure accordingly, and prioritize lands for protection.

This proof-of-concept project demonstrates the utility of precision conservation in land protection and green infrastructure planning, providing a valuable tool for planners and policymakers across the region. For example, Andrew, the head of the Green Infrastructure Team from Chesapeake Conservancy, and his team will use our web app to make informed decisions on which regions have the highest priority to receive funding.

2. Data and Methods

2.1 Understanding Land Cover data

The Chesapeake Conservancy provided high-resolution land cover data for 2013/14 and 2017/18. This vast raster dataset boasts an impressive 1-meter accuracy, offering 900 times more detail than the commonly used 30-meter resolution National Land Cover Dataset. Such a level of detail is crucial for capturing subtle changes in land cover.

The land cover classification includes pervious surfaces such as tree canopies and shrubs, which allow water to infiltrate the ground. In contrast, impervious surfaces encompass categories like roads and structures that prevent water infiltration, leading to increased runoff and potential flooding issues. Even though water and wetland are often considered impervious surfaces, in this study, we classify them as pervious surfaces due to their dynamic nature, interaction with groundwater, floodplain connectivity, and the critical functions of wetlands in water storage and infiltration.

Data Source

2.2 Ohter data

To understand how landcover change is affected by other environmental, social and economical factors, we also acquire data from the following source:

2.3 Unit of analysis

To make it easier for our future analysis, we gathered and resampled all data to 10 x 10 meters resolution as the basic analysis unit to ensure consistency.

3. Exploratory Analysis

3.1 Land Cover Type and Change Dynamics

We began by comparing the land cover patterns and changes across the three counties. This comparison helped us identify each county’s unique characteristics and trends, providing insights into how urban, suburban, and rural contexts affected land cover conversion. Land cover changes are highly related to the existing land cover type. For James City and Isle of Wight, tree canopy is the land cover type that undergoes the most change, while for Portsmouth, low vegetation experiences the most significant change.

3.2 Environmental Factors

Environmental factors played a significant role in land cover changes. We examined site characteristics that remained constant over time, such as elevation, slope, and soil type, to understand their influence on land cover conversion patterns. Understanding these static factors helped us predict how land cover might evolve in different environmental settings.

Take Portsmouth county as example, the plot below demonstrates that the mean slope in areas where land cover changed from pervious to impervious between 2014 and 2018 (1) is significantly higher than in areas that did not change or changed in the opposite direction (0).

3.3 Social and Economical Factors

Social and economic factors, which change over time, also impact land cover changes. We investigated variables such as population growth, economic development, and demographic changes to understand how these factors contributed to land cover conversion. By incorporating these dynamic factors into our analysis, we were able to better forecast land cover changes based on potential future scenarios.

The plots presented here illustrate that the percentage of white population change exhibits a different pattern in areas of land cover change compared to the overall county. This observation indicates that in Portsmouth County, land cover change is also associated with changes in census data, particularly the percentage of white population change.

4. Feature Engineering

4.1 Spatial Effects

Incorporating spatial relationships into our model was crucial for capturing the spatial influence of original land cover types on land cover change. We performed focal raster calculations and spatial lag calculations to create features that accounted for the spatial context of land cover conversion. These engineered features helped us develop a more accurate and robust predictive model, capable of capturing the nuances of land cover change across diverse development contexts.

4.2 Final Features (Need Check!)

Dependent Variable

  • Whether the land cover change from impervious to previous

Independent Variables

  • Existing land cover types
    • Pop change
    • Pct of white change
    • Unitchange
    • Median Household Income change
  • Environmental factors
    • Elevation (Terrain)
    • Slope
    • Soil Type
  • Socio-economic factors
    • Pop change
    • Pct of white change
    • Unitchange
    • Median Household Income change
  • Spatial Lag factors
    • Pop change
    • Pct of white change
    • Unitchange
    • Median Household Income change

5. Modeling & Evaluation (Need Check!)

5.1 Model Building

To ensure computational efficiency and scalability, we downsampled the original dataset to 500,000 data points for model building and then fitted the selected model back to the whole dataset for future predictions. We employed geo cross-validation at the block group level to ensure the robustness of our model and avoid overfitting.

Performance evaluation was conducted using the confusion matrix for binary threshold setting and model selection. This approach allowed us to assess the accuracy, sensitivity, and specificity of the models and compare their performance.

5.2 Model Type Selection

Recognizing that different types of models perform well on different datasets, we experimented with three model types for predicting land cover change: Random Forest, XGBoost, and Binomial Generalized Linear Model (GLM). These models were chosen due to their ability to handle complex interactions and non-linear relationships within the data.

After evaluating the performance of each model type, we selected Random Forest as the most suitable model for our analysis, as it demonstrated the best accuracy. Random Forest is an ensemble learning method that builds multiple decision trees and combines their results to improve overall accuracy and stability. This model is particularly well-suited for handling high-dimensional and noisy data, making it an ideal choice for predicting land cover changes in our study area.

5.3 Refine for better prediction

5.4 Model Evaluation & Validation

roc

5.5 Comparison between Counties

6. Prediction & Error Analysis

By comparing the predicted 2018 land cover change with the observed change, we can tell that errors in the prediction are likely to be around the true value, indicating the effectiveness of the model. Looking at the future prediction of 2021, we can see that many of the predicted changes are consistent with the observed change. However, the model has also identified new areas of land cover change. This suggests that the model is able to detect changes that were not previously observed, which can be valuable for land management and conservation efforts.

6. Conclusion

7. Code Appendix

LS0tDQp0aXRsZTogIlByZWNpc2lvbiBGb3JlY2FzdHMgb2YgTGFuZCBDb3ZlciBDaGFuZ2UiDQpzdWJ0aXRsZTogIkNoZXNhcGVha2UgV2F0ZXJzaGVkIg0KYXV0aG9yOiAiWXVld2VuIERhaSwgU2h1amluZyBZaSwgWGluZ2UgWmhhbmciDQpkYXRlOiAiMjAyMy0wNC0yNSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KW1JldHVybiB0byBNVVNBIDgwMSBQcm9qZWN0cyBQYWdlXShodHRwczovL3Blbm5tdXNhLmdpdGh1Yi5pby9NVVNBXzgwMS5pby8pDQoNClRoaXMgcHJvamVjdCB3YXMgY29tcGxldGVkIGZvciB0aGUgTVVTQS9TbWFydCBDaXRpZXMgUHJhY3RpY3VtIGNvdXJzZSAoTVVTQSA4MDEpIGluc3RydWN0ZWQgYnkgTWljaGFlbCBGaWNobWFuIGFuZCBNYXR0aGV3IEhhcnJpcy4gV2UgYXJlIGdyYXRlZnVsIHRvIG91ciBpbnN0cnVjdG9ycyBmb3IgdGhlaXIgY29udGludWVkIHN1cHBvcnQgYW5kIGZlZWRiYWNrLiBXZSB3b3VsZCBsaWtlIHRvIGdpdmUgc3BlY2lhbCB0aGFua3MgdG8gS0MgRmlsaXBwaW5vIGFuZCBCZW4gTWNGYXJsYW5lIGZyb20gSGFtcHRvbiBSb2FkcyBQbGFubmluZyBEaXN0cmljdCBDb21taXNzaW9uLCBhbmQgRGV4dGVyIExvY2tlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgRm9yZXN0IFNlcnZpY2UgZm9yIHByb3ZpZGluZyBkYXRhLCBpbnNpZ2h0LCBhbmQgc3VwcG9ydCB0aHJvdWdob3V0IHRoZSBzZW1lc3Rlci4gVGhpcyBwcm9qZWN0IHdvdWxkIG5vdCBoYXZlIGJlZW4gcG9zc2libGUgd2l0aG91dCB0aGVtLg0KDQpbVmlldyBEYXNoYm9hcmRdKGh0dHBzOi8veXVld2VuZGFpLmdpdGh1Yi5pby9NVVNBLVByYWN0aWN1bS1XZWIvKQ0KDQojIyAxLkludHJvZHVjdGlvbg0KIyMjIDEuMSBBYnN0cmFjdA0KVGhpcyBwcm9qZWN0IGFpbXMgdG8gZGV2ZWxvcCBhIHByZWNpc2lvbiBmb3JlY2FzdCBtb2RlbCBmb3IgbGFuZCBjb3ZlciBjaGFuZ2UgYXQgdGhlIENoZXNhcGVha2UgV2F0ZXJzaGVkLiBCeSBsZXZlcmFnaW5nIGhpZ2gtcmVzb2x1dGlvbiBsb25naXR1ZGluYWwgbGFuZCBjb3ZlciBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBDaGVzYXBlYWtlIENvbnNlcnZhbmN5LCB0aGUgbW9kZWwgd2lsbCBwcmVkaWN0IGxhbmQgY292ZXIgY29udmVyc2lvbnMgZnJvbSBwZXJ2aW91cyB0byBpbXBlcnZpb3VzIHN1cmZhY2VzLiBUaGlzIGZvcmVjYXN0IHdpbGwgZW5hYmxlIGxhbmQgdXNlIGFuZCBlbnZpcm9ubWVudGFsIHBsYW5uZXJzIHRvIGlkZW50aWZ5IHdoZXJlIHVyYmFuIGdyb3d0aCB3aWxsIG9jY3VyLCBwcm9wb3NlIGdyZWVuIGluZnJhc3RydWN0dXJlIGFjY29yZGluZ2x5LCBhbmQgcHJpb3JpdGl6ZSBsYW5kcyBmb3IgcHJvdGVjdGlvbi4gVGhlIG1vZGVsIHdpbGwgYmUgZ2VuZXJhbGl6YWJsZSB0byB0aGUgY291bnR5IGxldmVsLCBpbmNvcnBvcmF0aW5nIG9ubHkgd2lkZWx5IGF2YWlsYWJsZSBpbnB1dHMsIHRodXMgYWxsb3dpbmcgYW55IG11bmljaXBhbGl0eSB3aXRoaW4gdGhlIENoZXNhcGVha2UgYmFzaW4gdG8gcmVwbGljYXRlIHRoZSBhbmFseXNpcy4gVGhpcyBwcm9vZi1vZi1jb25jZXB0IHByb2plY3Qgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgdXRpbGl0eSBvZiBwcmVjaXNpb24gY29uc2VydmF0aW9uIGluIGxhbmQgcHJvdGVjdGlvbiBhbmQgZ3JlZW4gaW5mcmFzdHJ1Y3R1cmUgcGxhbm5pbmcgYW5kIHByb3ZpZGUgYSB2YWx1YWJsZSB0b29sIGZvciBwbGFubmVycyBhbmQgcG9saWN5bWFrZXJzIGFjcm9zcyB0aGUgcmVnaW9uLg0KDQojIyMgMS4yIEJhY2tncm91bmQgDQpUaGUgQ2hlc2FwZWFrZSBCYXkgd2F0ZXJzaGVkIGlzIGFuIGVjb2xvZ2ljYWxseSBhbmQgZWNvbm9taWNhbGx5IHNpZ25pZmljYW50IHJlc291cmNlLCBlbmNvbXBhc3NpbmcgZGl2ZXJzZSBlY29zeXN0ZW1zIGFuZCBzdXBwb3J0aW5nIGEgbXVsdGl0dWRlIG9mIGluZHVzdHJpZXMsIGluY2x1ZGluZyBhZ3JpY3VsdHVyZSwgdG91cmlzbSwgYW5kIGZpc2hlcmllcy4gSG93ZXZlciwgdGhlIHJlZ2lvbiBpcyBmYWNpbmcgaW5jcmVhc2luZyBlbnZpcm9ubWVudGFsIGNoYWxsZW5nZXMgZHVlIHRvIHRoZSBjb21iaW5lZCBlZmZlY3RzIG9mIHNlYS1sZXZlbCByaXNlIGFuZCBsYW5kIHN1YnNpZGVuY2UuIEFzIGEgcmVzdWx0LCB0aGUgYXJlYSBoYXMgYmVjb21lIHRoZSBzZWNvbmQtbW9zdCB2dWxuZXJhYmxlIHJlZ2lvbiBpbiB0aGUgbmF0aW9uIHRvIGZsb29kaW5nIGFuZCBzdG9ybSBzdXJnZSwgb25seSBhZnRlciBOZXcgT3JsZWFucy4gUHJlZGljdGluZyBsYW5kIGNvdmVyIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB0aGUgY29udmVyc2lvbiBmcm9tIHBlcnZpb3VzIHRvIGltcGVydmlvdXMgc3VyZmFjZXMsIGlzIGNydWNpYWwgaW4gYWRkcmVzc2luZyB0aGVzZSBjaGFsbGVuZ2VzIGFuZCBpbmZvcm1pbmcgY2xpbWF0ZSBhZGFwdGF0aW9uIGFuZCBtaXRpZ2F0aW9uIHBsYW5uaW5nLg0KDQpPdXIgcHJvamVjdCBmb2N1c2VzIG9uIHRocmVlIGRpc3RpbmN0IGNvdW50aWVzIHdpdGhpbiB0aGUgQ2hlc2FwZWFrZSBCYXkgd2F0ZXJzaGVkLCByZXByZXNlbnRpbmcgdmFyeWluZyBkZXZlbG9wbWVudCBjb250ZXh0cy4gUG9ydHNtb3V0aCBpcyB0aGUgdXJiYW4gcHJvdG90eXBlIGNoYXJhY3Rlcml6ZWQgYnkgaXRzIGRlbnNlIHJlc2lkZW50aWFsLCBjb21tZXJjaWFsLCBhbmQgaW5kdXN0cmlhbCBhcmVhcy4gSmFtZXMgQ2l0eSBDb3VudHkgZXhlbXBsaWZpZXMgYSBzdWJ1cmJhbiBjb250ZXh0LCB3aXRoIGEgbWl4IG9mIHJ1cmFsLCBzdWJ1cmJhbiwgYW5kIHVyYmFuIGRldmVsb3BtZW50IGFuZCBhIGRpdmVyc2UgbGFuZHNjYXBlIGVuY29tcGFzc2luZyBmb3Jlc3RzLCB3ZXRsYW5kcywgYW5kIGhpc3RvcmljIHNpdGVzLiBMYXN0bHksIElzbGUgb2YgV2lnaHQgQ291bnR5IHJlcHJlc2VudHMgdGhlIHJ1cmFsIGFzcGVjdCwgcHJlZG9taW5hbnRseSBjaGFyYWN0ZXJpemVkIGJ5IGFncmljdWx0dXJlLCBmb3Jlc3RyeSwgYW5kIGV4dGVuc2l2ZSBuYXR1cmFsIGhhYml0YXRzLiBCeSBjb25zaWRlcmluZyB0aGVzZSBkaXZlcnNlIGNvdW50aWVzLCB3ZSBjYW4gZGV2ZWxvcCBhIGNvbXByZWhlbnNpdmUgYW5kIGdlbmVyYWxpemFibGUgbW9kZWwgdG8gcHJlZGljdCBsYW5kIGNvdmVyIGNoYW5nZXMgYWNyb3NzIHZhcmlvdXMgcmVnaW9uYWwgZGV2ZWxvcG1lbnQgc2NlbmFyaW9zLg0KDQohW10oaW1hZ2VzL0hSUERDLmpwZykNCg0KDQojIyMgMS4zIE1vdGl2YXRpb24gJiBVc2UgQ2FzZQ0KDQpCdWlsZGluZyByZXNpbGllbnQgY29tbXVuaXRpZXMgaXMgYSB0b3AgcHJpb3JpdHkgZm9yIHRoZSBIYW1wdG9uIFJvYWRzIFBsYW5uaW5nIERpc3RyaWN0IENvbW1pc3Npb24gKEhSUERDKS4gVG8gc3VwcG9ydCB0aGlzIGdvYWwsIHRoZSBIUlBEQyBoYXMgZXN0YWJsaXNoZWQgYSBncmVlbiBpbmZyYXN0cnVjdHVyZSBwbGFuIHRoYXQgc2Vla3MgdG8gaWRlbnRpZnkgYW5kIHByaW9yaXRpemUgYSBuZXR3b3JrIG9mIHZhbHVhYmxlIGNvbnNlcnZhdGlvbiBsYW5kcy4gVGhpcyBwbGFuIGFpbXMgdG8gYWNoaWV2ZSBtdWx0aXBsZSBiZW5lZml0cywgc3VjaCBhcyBoYWJpdGF0IHByb3RlY3Rpb24sIGRyaW5raW5nIHdhdGVyIHN1cHBseSBwcm90ZWN0aW9uLCBzdG9ybXdhdGVyIG1hbmFnZW1lbnQsIGFuZCByZWNyZWF0aW9uYWwgb3Bwb3J0dW5pdGllcy4NCg0KQSBjcnVjaWFsIGNvbXBvbmVudCBvZiB0aGlzIHBsYW4gaW52b2x2ZXMgZGV2ZWxvcGluZyBhIG1vZGVsIHRvIGZvcmVjYXN0IHBvdGVudGlhbCBmdXR1cmUgZ3Jvd3RoIGFuZCBpZGVudGlmeSBhcmVhcyBvZiB0aGUgZ3JlZW4gaW5mcmFzdHJ1Y3R1cmUgbmV0d29yayB0aGF0IGFyZSBtb3N0IGF0IHJpc2sgZm9yIGRldmVsb3BtZW50LiBPdXIgcHJvamVjdCBhaW1zIHRvIGNyZWF0ZSBhIGZvcmVjYXN0IHRoYXQgZW5hYmxlcyBsYW5kIHVzZSBhbmQgZW52aXJvbm1lbnRhbCBwbGFubmVycyB0byBwaW5wb2ludCB3aGVyZSB1cmJhbiBncm93dGggaXMgbGlrZWx5IHRvIG9jY3VyLCBwcm9wb3NlIGdyZWVuIGluZnJhc3RydWN0dXJlIGFjY29yZGluZ2x5LCBhbmQgcHJpb3JpdGl6ZSBsYW5kcyBmb3IgcHJvdGVjdGlvbi4gDQoNClRoaXMgcHJvb2Ytb2YtY29uY2VwdCBwcm9qZWN0IGRlbW9uc3RyYXRlcyB0aGUgdXRpbGl0eSBvZiBwcmVjaXNpb24gY29uc2VydmF0aW9uIGluIGxhbmQgcHJvdGVjdGlvbiBhbmQgZ3JlZW4gaW5mcmFzdHJ1Y3R1cmUgcGxhbm5pbmcsIHByb3ZpZGluZyBhIHZhbHVhYmxlIHRvb2wgZm9yIHBsYW5uZXJzIGFuZCBwb2xpY3ltYWtlcnMgYWNyb3NzIHRoZSByZWdpb24uIEZvciBleGFtcGxlLCBBbmRyZXcsIHRoZSBoZWFkIG9mIHRoZSBHcmVlbiBJbmZyYXN0cnVjdHVyZSBUZWFtIGZyb20gQ2hlc2FwZWFrZSBDb25zZXJ2YW5jeSwgYW5kIGhpcyB0ZWFtIHdpbGwgdXNlIG91ciB3ZWIgYXBwIHRvIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zIG9uIHdoaWNoIHJlZ2lvbnMgaGF2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSB0byByZWNlaXZlIGZ1bmRpbmcuDQoNCiFbXShpbWFnZXMvdXNlX2Nhc2UucG5nKQ0KDQoNCiMjIDIuIERhdGEgYW5kIE1ldGhvZHMNCg0KIyMjIDIuMSBVbmRlcnN0YW5kaW5nIExhbmQgQ292ZXIgZGF0YQ0KVGhlIENoZXNhcGVha2UgQ29uc2VydmFuY3kgcHJvdmlkZWQgaGlnaC1yZXNvbHV0aW9uIGxhbmQgY292ZXIgZGF0YSBmb3IgMjAxMy8xNCBhbmQgMjAxNy8xOC4gVGhpcyB2YXN0IHJhc3RlciBkYXRhc2V0IGJvYXN0cyBhbiBpbXByZXNzaXZlIDEtbWV0ZXIgYWNjdXJhY3ksIG9mZmVyaW5nIDkwMCB0aW1lcyBtb3JlIGRldGFpbCB0aGFuIHRoZSBjb21tb25seSB1c2VkIDMwLW1ldGVyIHJlc29sdXRpb24gTmF0aW9uYWwgTGFuZCBDb3ZlciBEYXRhc2V0LiBTdWNoIGEgbGV2ZWwgb2YgZGV0YWlsIGlzIGNydWNpYWwgZm9yIGNhcHR1cmluZyBzdWJ0bGUgY2hhbmdlcyBpbiBsYW5kIGNvdmVyLg0KDQpUaGUgbGFuZCBjb3ZlciBjbGFzc2lmaWNhdGlvbiBpbmNsdWRlcyBwZXJ2aW91cyBzdXJmYWNlcyBzdWNoIGFzIHRyZWUgY2Fub3BpZXMgYW5kIHNocnVicywgd2hpY2ggYWxsb3cgd2F0ZXIgdG8gaW5maWx0cmF0ZSB0aGUgZ3JvdW5kLiBJbiBjb250cmFzdCwgaW1wZXJ2aW91cyBzdXJmYWNlcyBlbmNvbXBhc3MgY2F0ZWdvcmllcyBsaWtlIHJvYWRzIGFuZCBzdHJ1Y3R1cmVzIHRoYXQgcHJldmVudCB3YXRlciBpbmZpbHRyYXRpb24sIGxlYWRpbmcgdG8gaW5jcmVhc2VkIHJ1bm9mZiBhbmQgcG90ZW50aWFsIGZsb29kaW5nIGlzc3Vlcy4gRXZlbiB0aG91Z2ggd2F0ZXIgYW5kIHdldGxhbmQgYXJlIG9mdGVuIGNvbnNpZGVyZWQgaW1wZXJ2aW91cyBzdXJmYWNlcywgaW4gdGhpcyBzdHVkeSwgd2UgY2xhc3NpZnkgdGhlbSBhcyBwZXJ2aW91cyBzdXJmYWNlcyBkdWUgdG8gdGhlaXIgZHluYW1pYyBuYXR1cmUsIGludGVyYWN0aW9uIHdpdGggZ3JvdW5kd2F0ZXIsIGZsb29kcGxhaW4gY29ubmVjdGl2aXR5LCBhbmQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyBvZiB3ZXRsYW5kcyBpbiB3YXRlciBzdG9yYWdlIGFuZCBpbmZpbHRyYXRpb24uIA0KDQohW10oaW1hZ2VzL0RhdGEucG5nKQ0KDQpbRGF0YSBTb3VyY2VdKGh0dHBzOi8vd3d3LmNoZXNhcGVha2Vjb25zZXJ2YW5jeS5vcmcvY29uc2VydmF0aW9uLWlubm92YXRpb24tY2VudGVyL2hpZ2gtcmVzb2x1dGlvbi1kYXRhL2x1bGMtZGF0YS1wcm9qZWN0LTIwMjIvKQ0KDQoNCiMjIyAyLjIgT2h0ZXIgZGF0YQ0KVG8gdW5kZXJzdGFuZCBob3cgbGFuZGNvdmVyIGNoYW5nZSBpcyBhZmZlY3RlZCBieSBvdGhlciBlbnZpcm9ubWVudGFsLCBzb2NpYWwgYW5kIGVjb25vbWljYWwgZmFjdG9ycywgd2UgYWxzbyBhY3F1aXJlIGRhdGEgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZTogDQoNCiogW0RFTSAoIDEgYXJjLXNlY29uZCkgZnJvbSBVU0dTXShodHRwczovL2FwcHMubmF0aW9uYWxtYXAuZ292L2Rvd25sb2FkZXIvKQ0KDQoqIFtTb2lsIERhdGEgZnJvbSB0aGUgV2ViIFNvaWwgU3VydmV5XShodHRwczovL3dlYnNvaWxzdXJ2ZXkubnJjcy51c2RhLmdvdi9hcHAvKQ0KDQoqIGNlbnN1cyB0cmFjdC1sZXZlbCBkYXRhICgyMDE0LCAyMDE4LCAyMDIxKSBmcm9tIGZvdXIgeWVhcnMgb2YgdGhlIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgKEFDUykgDQoNCiMjIyAyLjMgVW5pdCBvZiBhbmFseXNpcw0KVG8gbWFrZSBpdCBlYXNpZXIgZm9yIG91ciBmdXR1cmUgYW5hbHlzaXMsIHdlIGdhdGhlcmVkIGFuZCByZXNhbXBsZWQgYWxsIGRhdGEgdG8gMTAgeCAxMCBtZXRlcnMgcmVzb2x1dGlvbiBhcyB0aGUgYmFzaWMgYW5hbHlzaXMgdW5pdCB0byBlbnN1cmUgY29uc2lzdGVuY3kuDQoNCg0KIVtdKGltYWdlcy9tZXRob2QucG5nKQ0KDQoNCg0KDQojIyAzLiBFeHBsb3JhdG9yeSBBbmFseXNpcw0KDQojIyMgMy4xIExhbmQgQ292ZXIgVHlwZSBhbmQgQ2hhbmdlIER5bmFtaWNzDQpXZSBiZWdhbiBieSBjb21wYXJpbmcgdGhlIGxhbmQgY292ZXIgcGF0dGVybnMgYW5kIGNoYW5nZXMgYWNyb3NzIHRoZSB0aHJlZSBjb3VudGllcy4gVGhpcyBjb21wYXJpc29uIGhlbHBlZCB1cyBpZGVudGlmeSBlYWNoIGNvdW50eSdzIHVuaXF1ZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHRyZW5kcywgcHJvdmlkaW5nIGluc2lnaHRzIGludG8gaG93IHVyYmFuLCBzdWJ1cmJhbiwgYW5kIHJ1cmFsIGNvbnRleHRzIGFmZmVjdGVkIGxhbmQgY292ZXIgY29udmVyc2lvbi4gTGFuZCBjb3ZlciBjaGFuZ2VzIGFyZSBoaWdobHkgcmVsYXRlZCB0byB0aGUgZXhpc3RpbmcgbGFuZCBjb3ZlciB0eXBlLiBGb3IgSmFtZXMgQ2l0eSBhbmQgSXNsZSBvZiBXaWdodCwgdHJlZSBjYW5vcHkgaXMgdGhlIGxhbmQgY292ZXIgdHlwZSB0aGF0IHVuZGVyZ29lcyB0aGUgbW9zdCBjaGFuZ2UsIHdoaWxlIGZvciBQb3J0c21vdXRoLCBsb3cgdmVnZXRhdGlvbiBleHBlcmllbmNlcyB0aGUgbW9zdCBzaWduaWZpY2FudCBjaGFuZ2UuDQoNCiFbXShpbWFnZXMvbGFuZGNvdmVyLnBuZykNCg0KIyMjIDMuMiBFbnZpcm9ubWVudGFsIEZhY3RvcnMNCg0KRW52aXJvbm1lbnRhbCBmYWN0b3JzIHBsYXllZCBhIHNpZ25pZmljYW50IHJvbGUgaW4gbGFuZCBjb3ZlciBjaGFuZ2VzLiBXZSBleGFtaW5lZCBzaXRlIGNoYXJhY3RlcmlzdGljcyB0aGF0IHJlbWFpbmVkIGNvbnN0YW50IG92ZXIgdGltZSwgc3VjaCBhcyBlbGV2YXRpb24sIHNsb3BlLCBhbmQgc29pbCB0eXBlLCB0byB1bmRlcnN0YW5kIHRoZWlyIGluZmx1ZW5jZSBvbiBsYW5kIGNvdmVyIGNvbnZlcnNpb24gcGF0dGVybnMuIFVuZGVyc3RhbmRpbmcgdGhlc2Ugc3RhdGljIGZhY3RvcnMgaGVscGVkIHVzIHByZWRpY3QgaG93IGxhbmQgY292ZXIgbWlnaHQgZXZvbHZlIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudGFsIHNldHRpbmdzLg0KDQpUYWtlIFBvcnRzbW91dGggY291bnR5IGFzIGV4YW1wbGUsIHRoZSBwbG90IGJlbG93IGRlbW9uc3RyYXRlcyB0aGF0IHRoZSBtZWFuIHNsb3BlIGluIGFyZWFzIHdoZXJlIGxhbmQgY292ZXIgY2hhbmdlZCBmcm9tIHBlcnZpb3VzIHRvIGltcGVydmlvdXMgYmV0d2VlbiAyMDE0IGFuZCAyMDE4ICgxKSBpcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIGluIGFyZWFzIHRoYXQgZGlkIG5vdCBjaGFuZ2Ugb3IgY2hhbmdlZCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uICgwKS4NCg0KIVtdKGltYWdlcy9lbnZpcm9ubWVudC5wbmcpDQoNCiMjIyAzLjMgU29jaWFsIGFuZCBFY29ub21pY2FsIEZhY3RvcnMNClNvY2lhbCBhbmQgZWNvbm9taWMgZmFjdG9ycywgd2hpY2ggY2hhbmdlIG92ZXIgdGltZSwgYWxzbyBpbXBhY3QgbGFuZCBjb3ZlciBjaGFuZ2VzLiBXZSBpbnZlc3RpZ2F0ZWQgdmFyaWFibGVzIHN1Y2ggYXMgcG9wdWxhdGlvbiBncm93dGgsIGVjb25vbWljIGRldmVsb3BtZW50LCBhbmQgZGVtb2dyYXBoaWMgY2hhbmdlcyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmYWN0b3JzIGNvbnRyaWJ1dGVkIHRvIGxhbmQgY292ZXIgY29udmVyc2lvbi4gQnkgaW5jb3Jwb3JhdGluZyB0aGVzZSBkeW5hbWljIGZhY3RvcnMgaW50byBvdXIgYW5hbHlzaXMsIHdlIHdlcmUgYWJsZSB0byBiZXR0ZXIgZm9yZWNhc3QgbGFuZCBjb3ZlciBjaGFuZ2VzIGJhc2VkIG9uIHBvdGVudGlhbCBmdXR1cmUgc2NlbmFyaW9zLg0KDQpUaGUgcGxvdHMgcHJlc2VudGVkIGhlcmUgaWxsdXN0cmF0ZSB0aGF0IHRoZSBwZXJjZW50YWdlIG9mIHdoaXRlIHBvcHVsYXRpb24gY2hhbmdlIGV4aGliaXRzIGEgZGlmZmVyZW50IHBhdHRlcm4gaW4gYXJlYXMgb2YgbGFuZCBjb3ZlciBjaGFuZ2UgY29tcGFyZWQgdG8gdGhlIG92ZXJhbGwgY291bnR5LiBUaGlzIG9ic2VydmF0aW9uIGluZGljYXRlcyB0aGF0IGluIFBvcnRzbW91dGggQ291bnR5LCBsYW5kIGNvdmVyIGNoYW5nZSBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIGluIGNlbnN1cyBkYXRhLCBwYXJ0aWN1bGFybHkgdGhlIHBlcmNlbnRhZ2Ugb2Ygd2hpdGUgcG9wdWxhdGlvbiBjaGFuZ2UuDQoNCg0KIVtdKGltYWdlcy9zb2NpYWwucG5nKQ0KDQoNCg0KIyMgNC4gRmVhdHVyZSBFbmdpbmVlcmluZw0KDQojIyMgNC4xIFNwYXRpYWwgRWZmZWN0cw0KSW5jb3Jwb3JhdGluZyBzcGF0aWFsIHJlbGF0aW9uc2hpcHMgaW50byBvdXIgbW9kZWwgd2FzIGNydWNpYWwgZm9yIGNhcHR1cmluZyB0aGUgc3BhdGlhbCBpbmZsdWVuY2Ugb2Ygb3JpZ2luYWwgbGFuZCBjb3ZlciB0eXBlcyBvbiBsYW5kIGNvdmVyIGNoYW5nZS4gV2UgcGVyZm9ybWVkIGZvY2FsIHJhc3RlciBjYWxjdWxhdGlvbnMgYW5kIHNwYXRpYWwgbGFnIGNhbGN1bGF0aW9ucyB0byBjcmVhdGUgZmVhdHVyZXMgdGhhdCBhY2NvdW50ZWQgZm9yIHRoZSBzcGF0aWFsIGNvbnRleHQgb2YgbGFuZCBjb3ZlciBjb252ZXJzaW9uLiBUaGVzZSBlbmdpbmVlcmVkIGZlYXR1cmVzIGhlbHBlZCB1cyBkZXZlbG9wIGEgbW9yZSBhY2N1cmF0ZSBhbmQgcm9idXN0IHByZWRpY3RpdmUgbW9kZWwsIGNhcGFibGUgb2YgY2FwdHVyaW5nIHRoZSBudWFuY2VzIG9mIGxhbmQgY292ZXIgY2hhbmdlIGFjcm9zcyBkaXZlcnNlIGRldmVsb3BtZW50IGNvbnRleHRzLg0KDQohW10oaW1hZ2VzL2ZlYXR1cmVfZW5naW5lZXJpbmcucG5nKQ0KDQojIyMgNC4yIEZpbmFsIEZlYXR1cmVzIChOZWVkIENoZWNrISkNCiMjIyMgRGVwZW5kZW50IFZhcmlhYmxlDQoqIFdoZXRoZXIgdGhlIGxhbmQgY292ZXIgY2hhbmdlIGZyb20gaW1wZXJ2aW91cyB0byBwcmV2aW91cyANCg0KIyMjIyBJbmRlcGVuZGVudCBWYXJpYWJsZXMNCg0KKiBFeGlzdGluZyBsYW5kIGNvdmVyIHR5cGVzIA0KICAgICsgUG9wIGNoYW5nZQ0KICAgICsgUGN0IG9mIHdoaXRlIGNoYW5nZSANCiAgICArIFVuaXRjaGFuZ2UNCiAgICArIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIGNoYW5nZSAgIA0KDQoqIEVudmlyb25tZW50YWwgZmFjdG9ycw0KICAgICsgRWxldmF0aW9uIChUZXJyYWluKQ0KICAgICsgU2xvcGUNCiAgICArIFNvaWwgVHlwZQ0KDQoqIFNvY2lvLWVjb25vbWljIGZhY3RvcnMgDQogICAgKyBQb3AgY2hhbmdlDQogICAgKyBQY3Qgb2Ygd2hpdGUgY2hhbmdlIA0KICAgICsgVW5pdGNoYW5nZQ0KICAgICsgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgY2hhbmdlICAgIA0KDQoqIFNwYXRpYWwgTGFnIGZhY3RvcnMgDQogICAgKyBQb3AgY2hhbmdlDQogICAgKyBQY3Qgb2Ygd2hpdGUgY2hhbmdlIA0KICAgICsgVW5pdGNoYW5nZQ0KICAgICsgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgY2hhbmdlIA0KDQoNCg0KIyMgNS4gTW9kZWxpbmcgJiBFdmFsdWF0aW9uIChOZWVkIENoZWNrISkNCg0KIyMjIDUuMSBNb2RlbCBCdWlsZGluZw0KVG8gZW5zdXJlIGNvbXB1dGF0aW9uYWwgZWZmaWNpZW5jeSBhbmQgc2NhbGFiaWxpdHksIHdlIGRvd25zYW1wbGVkIHRoZSBvcmlnaW5hbCBkYXRhc2V0IHRvIDUwMCwwMDAgZGF0YSBwb2ludHMgZm9yIG1vZGVsIGJ1aWxkaW5nIGFuZCB0aGVuIGZpdHRlZCB0aGUgc2VsZWN0ZWQgbW9kZWwgYmFjayB0byB0aGUgd2hvbGUgZGF0YXNldCBmb3IgZnV0dXJlIHByZWRpY3Rpb25zLiBXZSBlbXBsb3llZCBnZW8gY3Jvc3MtdmFsaWRhdGlvbiBhdCB0aGUgYmxvY2sgZ3JvdXAgbGV2ZWwgdG8gZW5zdXJlIHRoZSByb2J1c3RuZXNzIG9mIG91ciBtb2RlbCBhbmQgYXZvaWQgb3ZlcmZpdHRpbmcuDQoNClBlcmZvcm1hbmNlIGV2YWx1YXRpb24gd2FzIGNvbmR1Y3RlZCB1c2luZyB0aGUgY29uZnVzaW9uIG1hdHJpeCBmb3IgYmluYXJ5IHRocmVzaG9sZCBzZXR0aW5nIGFuZCBtb2RlbCBzZWxlY3Rpb24uIFRoaXMgYXBwcm9hY2ggYWxsb3dlZCB1cyB0byBhc3Nlc3MgdGhlIGFjY3VyYWN5LCBzZW5zaXRpdml0eSwgYW5kIHNwZWNpZmljaXR5IG9mIHRoZSBtb2RlbHMgYW5kIGNvbXBhcmUgdGhlaXIgcGVyZm9ybWFuY2UuDQoNCiFbXShpbWFnZXMvc2FtcGxlLnBuZykNCg0KIyMjIDUuMiBNb2RlbCBUeXBlIFNlbGVjdGlvbg0KDQpSZWNvZ25pemluZyB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBtb2RlbHMgcGVyZm9ybSB3ZWxsIG9uIGRpZmZlcmVudCBkYXRhc2V0cywgd2UgZXhwZXJpbWVudGVkIHdpdGggdGhyZWUgbW9kZWwgdHlwZXMgZm9yIHByZWRpY3RpbmcgbGFuZCBjb3ZlciBjaGFuZ2U6IFJhbmRvbSBGb3Jlc3QsIFhHQm9vc3QsIGFuZCBCaW5vbWlhbCBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWwgKEdMTSkuIFRoZXNlIG1vZGVscyB3ZXJlIGNob3NlbiBkdWUgdG8gdGhlaXIgYWJpbGl0eSB0byBoYW5kbGUgY29tcGxleCBpbnRlcmFjdGlvbnMgYW5kIG5vbi1saW5lYXIgcmVsYXRpb25zaGlwcyB3aXRoaW4gdGhlIGRhdGEuDQoNCkFmdGVyIGV2YWx1YXRpbmcgdGhlIHBlcmZvcm1hbmNlIG9mIGVhY2ggbW9kZWwgdHlwZSwgd2Ugc2VsZWN0ZWQgUmFuZG9tIEZvcmVzdCBhcyB0aGUgbW9zdCBzdWl0YWJsZSBtb2RlbCBmb3Igb3VyIGFuYWx5c2lzLCBhcyBpdCBkZW1vbnN0cmF0ZWQgdGhlIGJlc3QgYWNjdXJhY3kuIFJhbmRvbSBGb3Jlc3QgaXMgYW4gZW5zZW1ibGUgbGVhcm5pbmcgbWV0aG9kIHRoYXQgYnVpbGRzIG11bHRpcGxlIGRlY2lzaW9uIHRyZWVzIGFuZCBjb21iaW5lcyB0aGVpciByZXN1bHRzIHRvIGltcHJvdmUgb3ZlcmFsbCBhY2N1cmFjeSBhbmQgc3RhYmlsaXR5LiBUaGlzIG1vZGVsIGlzIHBhcnRpY3VsYXJseSB3ZWxsLXN1aXRlZCBmb3IgaGFuZGxpbmcgaGlnaC1kaW1lbnNpb25hbCBhbmQgbm9pc3kgZGF0YSwgbWFraW5nIGl0IGFuIGlkZWFsIGNob2ljZSBmb3IgcHJlZGljdGluZyBsYW5kIGNvdmVyIGNoYW5nZXMgaW4gb3VyIHN0dWR5IGFyZWEuDQoNCiFbXShpbWFnZXMvbW9kZWxfY29tcGFyZS5wbmcpDQoNCiMjIyA1LjMgUmVmaW5lIGZvciBiZXR0ZXIgcHJlZGljdGlvbg0KDQoNCg0KIyMjIDUuNCBNb2RlbCBFdmFsdWF0aW9uICYgVmFsaWRhdGlvbg0KDQpyb2MNCg0KIVtdKGltYWdlcy9zZW4ucG5nKQ0KDQoNCiMjIyA1LjUgQ29tcGFyaXNvbiBiZXR3ZWVuIENvdW50aWVzDQoNCiFbXShpbWFnZXMvbW9kZWxfaW1wb3J0YW5jZS5wbmcpDQoNCg0KIyMgNi4gUHJlZGljdGlvbiAmIEVycm9yIEFuYWx5c2lzDQoNCkJ5IGNvbXBhcmluZyB0aGUgcHJlZGljdGVkIDIwMTggbGFuZCBjb3ZlciBjaGFuZ2Ugd2l0aCB0aGUgb2JzZXJ2ZWQgY2hhbmdlLCB3ZSBjYW4gdGVsbCB0aGF0IGVycm9ycyBpbiB0aGUgcHJlZGljdGlvbiBhcmUgbGlrZWx5IHRvIGJlIGFyb3VuZCB0aGUgdHJ1ZSB2YWx1ZSwgaW5kaWNhdGluZyB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgbW9kZWwuIExvb2tpbmcgYXQgdGhlIGZ1dHVyZSBwcmVkaWN0aW9uIG9mIDIwMjEsIHdlIGNhbiBzZWUgdGhhdCBtYW55IG9mIHRoZSBwcmVkaWN0ZWQgY2hhbmdlcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBvYnNlcnZlZCBjaGFuZ2UuIEhvd2V2ZXIsIHRoZSBtb2RlbCBoYXMgYWxzbyBpZGVudGlmaWVkIG5ldyBhcmVhcyBvZiBsYW5kIGNvdmVyIGNoYW5nZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBtb2RlbCBpcyBhYmxlIHRvIGRldGVjdCBjaGFuZ2VzIHRoYXQgd2VyZSBub3QgcHJldmlvdXNseSBvYnNlcnZlZCwgd2hpY2ggY2FuIGJlIHZhbHVhYmxlIGZvciBsYW5kIG1hbmFnZW1lbnQgYW5kIGNvbnNlcnZhdGlvbiBlZmZvcnRzLg0KDQoNCiFbXShpbWFnZXMvcHJlZGljMTAwMC5wbmcpDQoNCg0KDQojIyA2LiBDb25jbHVzaW9uDQoNCiMjIDcuIENvZGUgQXBwZW5kaXgNCg==